home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / msvccompiler.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  16KB  |  582 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''distutils.msvccompiler
  5.  
  6. Contains MSVCCompiler, an implementation of the abstract CCompiler class
  7. for the Microsoft Visual Studio.
  8. '''
  9. __revision__ = '$Id: msvccompiler.py,v 1.64.2.4 2005/08/07 20:50:37 loewis Exp $'
  10. import sys
  11. import os
  12. import string
  13. from distutils.errors import DistutilsExecError, DistutilsPlatformError, CompileError, LibError, LinkError
  14. from distutils.ccompiler import CCompiler, gen_preprocess_options, gen_lib_options
  15. from distutils import log
  16. _can_read_reg = 0
  17.  
  18. try:
  19.     import _winreg
  20.     _can_read_reg = 1
  21.     hkey_mod = _winreg
  22.     RegOpenKeyEx = _winreg.OpenKeyEx
  23.     RegEnumKey = _winreg.EnumKey
  24.     RegEnumValue = _winreg.EnumValue
  25.     RegError = _winreg.error
  26. except ImportError:
  27.     
  28.     try:
  29.         import win32api
  30.         import win32con
  31.         _can_read_reg = 1
  32.         hkey_mod = win32con
  33.         RegOpenKeyEx = win32api.RegOpenKeyEx
  34.         RegEnumKey = win32api.RegEnumKey
  35.         RegEnumValue = win32api.RegEnumValue
  36.         RegError = win32api.error
  37.     except ImportError:
  38.         log.info("Warning: Can't read registry to find the necessary compiler setting\nMake sure that Python modules _winreg, win32api or win32con are installed.")
  39.     except:
  40.         None<EXCEPTION MATCH>ImportError
  41.     
  42.  
  43.     None<EXCEPTION MATCH>ImportError
  44.  
  45. if _can_read_reg:
  46.     HKEYS = (hkey_mod.HKEY_USERS, hkey_mod.HKEY_CURRENT_USER, hkey_mod.HKEY_LOCAL_MACHINE, hkey_mod.HKEY_CLASSES_ROOT)
  47.  
  48.  
  49. def read_keys(base, key):
  50.     '''Return list of registry keys.'''
  51.     
  52.     try:
  53.         handle = RegOpenKeyEx(base, key)
  54.     except RegError:
  55.         return None
  56.  
  57.     L = []
  58.     i = 0
  59.     while None:
  60.         
  61.         try:
  62.             k = RegEnumKey(handle, i)
  63.         except RegError:
  64.             break
  65.  
  66.         i = i + 1
  67.     return L
  68.  
  69.  
  70. def read_values(base, key):
  71.     '''Return dict of registry keys and values.
  72.  
  73.     All names are converted to lowercase.
  74.     '''
  75.     
  76.     try:
  77.         handle = RegOpenKeyEx(base, key)
  78.     except RegError:
  79.         return None
  80.  
  81.     d = { }
  82.     i = 0
  83.     while None:
  84.         
  85.         try:
  86.             (name, value, type) = RegEnumValue(handle, i)
  87.         except RegError:
  88.             break
  89.  
  90.         name = name.lower()
  91.         d[convert_mbcs(name)] = convert_mbcs(value)
  92.         i = i + 1
  93.     return d
  94.  
  95.  
  96. def convert_mbcs(s):
  97.     enc = getattr(s, 'encode', None)
  98.     if enc is not None:
  99.         
  100.         try:
  101.             s = enc('mbcs')
  102.         except UnicodeError:
  103.             pass
  104.         except:
  105.             None<EXCEPTION MATCH>UnicodeError
  106.         
  107.  
  108.     None<EXCEPTION MATCH>UnicodeError
  109.     return s
  110.  
  111.  
  112. class MacroExpander:
  113.     
  114.     def __init__(self, version):
  115.         self.macros = { }
  116.         self.load_macros(version)
  117.  
  118.     
  119.     def set_macro(self, macro, path, key):
  120.         for base in HKEYS:
  121.             d = read_values(base, path)
  122.             if d:
  123.                 self.macros['$(%s)' % macro] = d[key]
  124.                 break
  125.                 continue
  126.         
  127.  
  128.     
  129.     def load_macros(self, version):
  130.         vsbase = 'Software\\Microsoft\\VisualStudio\\%0.1f' % version
  131.         self.set_macro('VCInstallDir', vsbase + '\\Setup\\VC', 'productdir')
  132.         self.set_macro('VSInstallDir', vsbase + '\\Setup\\VS', 'productdir')
  133.         net = 'Software\\Microsoft\\.NETFramework'
  134.         self.set_macro('FrameworkDir', net, 'installroot')
  135.         
  136.         try:
  137.             if version > 7.0:
  138.                 self.set_macro('FrameworkSDKDir', net, 'sdkinstallrootv1.1')
  139.             else:
  140.                 self.set_macro('FrameworkSDKDir', net, 'sdkinstallroot')
  141.         except KeyError:
  142.             exc = None
  143.             raise DistutilsPlatformError, 'The .NET Framework SDK needs to be installed before building extensions for Python.'
  144.  
  145.         p = 'Software\\Microsoft\\NET Framework Setup\\Product'
  146.         for base in HKEYS:
  147.             
  148.             try:
  149.                 h = RegOpenKeyEx(base, p)
  150.             except RegError:
  151.                 continue
  152.  
  153.             key = RegEnumKey(h, 0)
  154.             d = read_values(base, '%s\\%s' % (p, key))
  155.             self.macros['$(FrameworkVersion)'] = d['version']
  156.         
  157.  
  158.     
  159.     def sub(self, s):
  160.         for k, v in self.macros.items():
  161.             s = string.replace(s, k, v)
  162.         
  163.         return s
  164.  
  165.  
  166.  
  167. def get_build_version():
  168.     '''Return the version of MSVC that was used to build Python.
  169.  
  170.     For Python 2.3 and up, the version number is included in
  171.     sys.version.  For earlier versions, assume the compiler is MSVC 6.
  172.     '''
  173.     prefix = 'MSC v.'
  174.     i = string.find(sys.version, prefix)
  175.     if i == -1:
  176.         return 6
  177.     
  178.     i = i + len(prefix)
  179.     (s, rest) = sys.version[i:].split(' ', 1)
  180.     majorVersion = int(s[:-2]) - 6
  181.     minorVersion = int(s[2:3]) / 10.0
  182.     if majorVersion == 6:
  183.         minorVersion = 0
  184.     
  185.     if majorVersion >= 6:
  186.         return majorVersion + minorVersion
  187.     
  188.  
  189.  
  190. class MSVCCompiler(CCompiler):
  191.     '''Concrete class that implements an interface to Microsoft Visual C++,
  192.        as defined by the CCompiler abstract class.'''
  193.     compiler_type = 'msvc'
  194.     executables = { }
  195.     _c_extensions = [
  196.         '.c']
  197.     _cpp_extensions = [
  198.         '.cc',
  199.         '.cpp',
  200.         '.cxx']
  201.     _rc_extensions = [
  202.         '.rc']
  203.     _mc_extensions = [
  204.         '.mc']
  205.     src_extensions = _c_extensions + _cpp_extensions + _rc_extensions + _mc_extensions
  206.     res_extension = '.res'
  207.     obj_extension = '.obj'
  208.     static_lib_extension = '.lib'
  209.     shared_lib_extension = '.dll'
  210.     static_lib_format = shared_lib_format = '%s%s'
  211.     exe_extension = '.exe'
  212.     
  213.     def __init__(self, verbose = 0, dry_run = 0, force = 0):
  214.         CCompiler.__init__(self, verbose, dry_run, force)
  215.         self._MSVCCompiler__version = get_build_version()
  216.         if self._MSVCCompiler__version >= 7:
  217.             self._MSVCCompiler__root = 'Software\\Microsoft\\VisualStudio'
  218.             self._MSVCCompiler__macros = MacroExpander(self._MSVCCompiler__version)
  219.         else:
  220.             self._MSVCCompiler__root = 'Software\\Microsoft\\Devstudio'
  221.         self.initialized = False
  222.  
  223.     
  224.     def initialize(self):
  225.         self._MSVCCompiler__paths = self.get_msvc_paths('path')
  226.         if len(self._MSVCCompiler__paths) == 0:
  227.             raise DistutilsPlatformError, "Python was built with version %s of Visual Studio, and extensions need to be built with the same version of the compiler, but it isn't installed." % self._MSVCCompiler__version
  228.         
  229.         self.cc = self.find_exe('cl.exe')
  230.         self.linker = self.find_exe('link.exe')
  231.         self.lib = self.find_exe('lib.exe')
  232.         self.rc = self.find_exe('rc.exe')
  233.         self.mc = self.find_exe('mc.exe')
  234.         self.set_path_env_var('lib')
  235.         self.set_path_env_var('include')
  236.         
  237.         try:
  238.             for p in string.split(os.environ['path'], ';'):
  239.                 self._MSVCCompiler__paths.append(p)
  240.         except KeyError:
  241.             pass
  242.  
  243.         os.environ['path'] = string.join(self._MSVCCompiler__paths, ';')
  244.         self.preprocess_options = None
  245.         self.compile_options = [
  246.             '/nologo',
  247.             '/Ox',
  248.             '/MD',
  249.             '/W3',
  250.             '/GX',
  251.             '/DNDEBUG']
  252.         self.compile_options_debug = [
  253.             '/nologo',
  254.             '/Od',
  255.             '/MDd',
  256.             '/W3',
  257.             '/GX',
  258.             '/Z7',
  259.             '/D_DEBUG']
  260.         self.ldflags_shared = [
  261.             '/DLL',
  262.             '/nologo',
  263.             '/INCREMENTAL:NO']
  264.         if self._MSVCCompiler__version >= 7:
  265.             self.ldflags_shared_debug = [
  266.                 '/DLL',
  267.                 '/nologo',
  268.                 '/INCREMENTAL:no',
  269.                 '/DEBUG']
  270.         else:
  271.             self.ldflags_shared_debug = [
  272.                 '/DLL',
  273.                 '/nologo',
  274.                 '/INCREMENTAL:no',
  275.                 '/pdb:None',
  276.                 '/DEBUG']
  277.         self.ldflags_static = [
  278.             '/nologo']
  279.         self.initialized = True
  280.  
  281.     
  282.     def object_filenames(self, source_filenames, strip_dir = 0, output_dir = ''):
  283.         if output_dir is None:
  284.             output_dir = ''
  285.         
  286.         obj_names = []
  287.         for src_name in source_filenames:
  288.             (base, ext) = os.path.splitext(src_name)
  289.             base = os.path.splitdrive(base)[1]
  290.             base = base[os.path.isabs(base):]
  291.             if ext not in self.src_extensions:
  292.                 raise CompileError("Don't know how to compile %s" % src_name)
  293.             
  294.             if strip_dir:
  295.                 base = os.path.basename(base)
  296.             
  297.             if ext in self._rc_extensions:
  298.                 obj_names.append(os.path.join(output_dir, base + self.res_extension))
  299.                 continue
  300.             if ext in self._mc_extensions:
  301.                 obj_names.append(os.path.join(output_dir, base + self.res_extension))
  302.                 continue
  303.             obj_names.append(os.path.join(output_dir, base + self.obj_extension))
  304.         
  305.         return obj_names
  306.  
  307.     
  308.     def compile(self, sources, output_dir = None, macros = None, include_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, depends = None):
  309.         if not self.initialized:
  310.             self.initialize()
  311.         
  312.         (macros, objects, extra_postargs, pp_opts, build) = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs)
  313.         if not extra_preargs:
  314.             pass
  315.         compile_opts = []
  316.         compile_opts.append('/c')
  317.         if debug:
  318.             compile_opts.extend(self.compile_options_debug)
  319.         else:
  320.             compile_opts.extend(self.compile_options)
  321.         for obj in objects:
  322.             
  323.             try:
  324.                 (src, ext) = build[obj]
  325.             except KeyError:
  326.                 continue
  327.  
  328.             if debug:
  329.                 src = os.path.abspath(src)
  330.             
  331.             if ext in self._c_extensions:
  332.                 input_opt = '/Tc' + src
  333.             elif ext in self._cpp_extensions:
  334.                 input_opt = '/Tp' + src
  335.             elif ext in self._rc_extensions:
  336.                 input_opt = src
  337.                 output_opt = '/fo' + obj
  338.                 
  339.                 try:
  340.                     self.spawn([
  341.                         self.rc] + pp_opts + [
  342.                         output_opt] + [
  343.                         input_opt])
  344.                 continue
  345.                 except DistutilsExecError:
  346.                     msg = None
  347.                     raise CompileError, msg
  348.                     continue
  349.                 
  350.  
  351.             elif ext in self._mc_extensions:
  352.                 h_dir = os.path.dirname(src)
  353.                 rc_dir = os.path.dirname(obj)
  354.                 
  355.                 try:
  356.                     self.spawn([
  357.                         self.mc] + [
  358.                         '-h',
  359.                         h_dir,
  360.                         '-r',
  361.                         rc_dir] + [
  362.                         src])
  363.                     (base, _) = os.path.splitext(os.path.basename(src))
  364.                     rc_file = os.path.join(rc_dir, base + '.rc')
  365.                     self.spawn([
  366.                         self.rc] + [
  367.                         '/fo' + obj] + [
  368.                         rc_file])
  369.                 continue
  370.                 except DistutilsExecError:
  371.                     msg = None
  372.                     raise CompileError, msg
  373.                     continue
  374.                 
  375.  
  376.             else:
  377.                 raise CompileError("Don't know how to compile %s to %s" % (src, obj))
  378.             output_opt = '/Fo' + obj
  379.             
  380.             try:
  381.                 self.spawn([
  382.                     self.cc] + compile_opts + pp_opts + [
  383.                     input_opt,
  384.                     output_opt] + extra_postargs)
  385.             continue
  386.             except DistutilsExecError:
  387.                 msg = None
  388.                 raise CompileError, msg
  389.                 continue
  390.             
  391.  
  392.         
  393.         return objects
  394.  
  395.     
  396.     def create_static_lib(self, objects, output_libname, output_dir = None, debug = 0, target_lang = None):
  397.         if not self.initialized:
  398.             self.initialize()
  399.         
  400.         (objects, output_dir) = self._fix_object_args(objects, output_dir)
  401.         output_filename = self.library_filename(output_libname, output_dir = output_dir)
  402.         if self._need_link(objects, output_filename):
  403.             lib_args = objects + [
  404.                 '/OUT:' + output_filename]
  405.             if debug:
  406.                 pass
  407.             
  408.             
  409.             try:
  410.                 self.spawn([
  411.                     self.lib] + lib_args)
  412.             except DistutilsExecError:
  413.                 msg = None
  414.                 raise LibError, msg
  415.             except:
  416.                 None<EXCEPTION MATCH>DistutilsExecError
  417.             
  418.  
  419.         None<EXCEPTION MATCH>DistutilsExecError
  420.         log.debug('skipping %s (up-to-date)', output_filename)
  421.  
  422.     
  423.     def link(self, target_desc, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  424.         if not self.initialized:
  425.             self.initialize()
  426.         
  427.         (objects, output_dir) = self._fix_object_args(objects, output_dir)
  428.         (libraries, library_dirs, runtime_library_dirs) = self._fix_lib_args(libraries, library_dirs, runtime_library_dirs)
  429.         if runtime_library_dirs:
  430.             self.warn("I don't know what to do with 'runtime_library_dirs': " + str(runtime_library_dirs))
  431.         
  432.         lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs, libraries)
  433.         if output_dir is not None:
  434.             output_filename = os.path.join(output_dir, output_filename)
  435.         
  436.         if self._need_link(objects, output_filename):
  437.             if target_desc == CCompiler.EXECUTABLE:
  438.                 if debug:
  439.                     ldflags = self.ldflags_shared_debug[1:]
  440.                 else:
  441.                     ldflags = self.ldflags_shared[1:]
  442.             elif debug:
  443.                 ldflags = self.ldflags_shared_debug
  444.             else:
  445.                 ldflags = self.ldflags_shared
  446.             export_opts = []
  447.             for sym in []:
  448.                 export_opts.append('/EXPORT:' + sym)
  449.             ld_args = ldflags + lib_opts + export_opts + objects + [
  450.                 '/OUT:' + output_filename]
  451.             if export_symbols is not None:
  452.                 (dll_name, dll_ext) = os.path.splitext(os.path.basename(output_filename))
  453.                 implib_file = os.path.join(os.path.dirname(objects[0]), self.library_filename(dll_name))
  454.                 ld_args.append('/IMPLIB:' + implib_file)
  455.             
  456.             if extra_preargs:
  457.                 ld_args[:0] = extra_preargs
  458.             
  459.             if extra_postargs:
  460.                 ld_args.extend(extra_postargs)
  461.             
  462.             self.mkpath(os.path.dirname(output_filename))
  463.             
  464.             try:
  465.                 self.spawn([
  466.                     self.linker] + ld_args)
  467.             except DistutilsExecError:
  468.                 msg = None
  469.                 raise LinkError, msg
  470.             except:
  471.                 None<EXCEPTION MATCH>DistutilsExecError
  472.             
  473.  
  474.         None<EXCEPTION MATCH>DistutilsExecError
  475.         log.debug('skipping %s (up-to-date)', output_filename)
  476.  
  477.     
  478.     def library_dir_option(self, dir):
  479.         return '/LIBPATH:' + dir
  480.  
  481.     
  482.     def runtime_library_dir_option(self, dir):
  483.         raise DistutilsPlatformError, "don't know how to set runtime library search path for MSVC++"
  484.  
  485.     
  486.     def library_option(self, lib):
  487.         return self.library_filename(lib)
  488.  
  489.     
  490.     def find_library_file(self, dirs, lib, debug = 0):
  491.         if debug:
  492.             try_names = [
  493.                 lib + '_d',
  494.                 lib]
  495.         else:
  496.             try_names = [
  497.                 lib]
  498.         for dir in dirs:
  499.             for name in try_names:
  500.                 libfile = os.path.join(dir, self.library_filename(name))
  501.                 if os.path.exists(libfile):
  502.                     return libfile
  503.                     continue
  504.             
  505.         else:
  506.             return None
  507.  
  508.     
  509.     def find_exe(self, exe):
  510.         """Return path to an MSVC executable program.
  511.  
  512.         Tries to find the program in several places: first, one of the
  513.         MSVC program search paths from the registry; next, the directories
  514.         in the PATH environment variable.  If any of those work, return an
  515.         absolute path that is known to exist.  If none of them work, just
  516.         return the original program name, 'exe'.
  517.         """
  518.         for p in self._MSVCCompiler__paths:
  519.             fn = os.path.join(os.path.abspath(p), exe)
  520.             if os.path.isfile(fn):
  521.                 return fn
  522.                 continue
  523.         
  524.         for p in string.split(os.environ['Path'], ';'):
  525.             fn = os.path.join(os.path.abspath(p), exe)
  526.             if os.path.isfile(fn):
  527.                 return fn
  528.                 continue
  529.         
  530.         return exe
  531.  
  532.     
  533.     def get_msvc_paths(self, path, platform = 'x86'):
  534.         '''Get a list of devstudio directories (include, lib or path).
  535.  
  536.         Return a list of strings.  The list will be empty if unable to
  537.         access the registry or appropriate registry keys not found.
  538.         '''
  539.         if not _can_read_reg:
  540.             return []
  541.         
  542.         path = path + ' dirs'
  543.         if self._MSVCCompiler__version >= 7:
  544.             key = '%s\\%0.1f\\VC\\VC_OBJECTS_PLATFORM_INFO\\Win32\\Directories' % (self._MSVCCompiler__root, self._MSVCCompiler__version)
  545.         else:
  546.             key = '%s\\6.0\\Build System\\Components\\Platforms\\Win32 (%s)\\Directories' % (self._MSVCCompiler__root, platform)
  547.         for base in HKEYS:
  548.             d = read_values(base, key)
  549.             if d:
  550.                 if self._MSVCCompiler__version >= 7:
  551.                     return string.split(self._MSVCCompiler__macros.sub(d[path]), ';')
  552.                 else:
  553.                     return string.split(d[path], ';')
  554.             self._MSVCCompiler__version >= 7
  555.         
  556.         if self._MSVCCompiler__version == 6:
  557.             for base in HKEYS:
  558.                 if read_values(base, '%s\\6.0' % self._MSVCCompiler__root) is not None:
  559.                     self.warn('It seems you have Visual Studio 6 installed, but the expected registry settings are not present.\nYou must at least run the Visual Studio GUI once so that these entries are created.')
  560.                 
  561.                 break
  562.             
  563.         
  564.         return []
  565.  
  566.     
  567.     def set_path_env_var(self, name):
  568.         """Set environment variable 'name' to an MSVC path type value.
  569.  
  570.         This is equivalent to a SET command prior to execution of spawned
  571.         commands.
  572.         """
  573.         if name == 'lib':
  574.             p = self.get_msvc_paths('library')
  575.         else:
  576.             p = self.get_msvc_paths(name)
  577.         if p:
  578.             os.environ[name] = string.join(p, ';')
  579.         
  580.  
  581.  
  582.